9.LED点阵屏 先点亮最右边一列#include REGX52.H #include INTRINS.H sbit my_RCLKP3^5;//两个传送带之间的闸门按一下第一个传送带上的所有东西会一次性复制到第二个传送带上 sbit my_SRCLKP3^6;//第一个传送带的动力按钮按一下传送带上所有东西都往前移一格 sbit my_SERP3^4;//SER第一个传送带的入口每次只能放一个 0 或 1 void _74HC595_input(unsigned char dat)//上升延 { unsigned char i; for(i0;i8;i) { my_SER(dat(7-i))1;//提取第7-i位的值 my_SRCLK0;//开 my_SRCLK1;//关 } my_RCLK0;//开 my_RCLK1;//关 } void Delay1ms(void) //11.0592MHz { unsigned char data i, j; _nop_(); i 2; j 199; do { while (--j); } while (--i); } unsigned char reverse_bits(unsigned char dat) { unsigned char result 0; // 准备一个空的新传送带所有格子都是0 unsigned char i; for(i0; i8; i) // 循环8次一个一个搬货物 { // 第一步用【模板4】从旧传送带的最右边拿一个货物 if( (dat i) 1 )//如果是0就不用放 { // 第二步用【模板2】把这个货物放到新传送带的最左边 result | (1 (7-i)); } } return result; // 新传送带装满了就是反转后的结果 } void my_matrix_scan(unsigned char column,unsigned char dat)//矩阵扫描函数减少IO接口的使用显示led点阵灯 { P00xFF;//在运行之前先消影确保正确运行 _74HC595_input(dat);//将要赋值的数值通过寄存器存入 P0~(1column);//将某一位清0 Delay1ms();//因为单片机执行速度非常快所以需要延迟函数不然肉眼无法观察. } void main(void) { while(1) { my_matrix_scan(7-0, ~0xE7); // 第0列最左 my_matrix_scan(7-1, ~0xDB); // 第1列 my_matrix_scan(7-2, ~0xBD); // 第2列 my_matrix_scan(7-3, ~0xDE); // 第3列 my_matrix_scan(7-4, ~0xDD); // 第4列 my_matrix_scan(7-5, ~0xDD); // 第5列 my_matrix_scan(7-6, ~0xBB); // 第6列 my_matrix_scan(7-7, ~0xC7); // 第7列最右 } }