- //利用数码管驱动芯片max7221实现8位数码管显示
- #include <reg51.h>
- #include <intrins.h>
- sbit DIN = P2^0; //数据串出引脚
- sbit CS = P2^1; //片选端
- sbit CLK = P2^2; //移位时钟端
- unsigned char disp_buff[8] = {2,0,1,0,10,2,10,9}; //显示的数字,数值为10的时候,显示“-”
- // 延时函数
- void delayms(unsigned int x)
- {
- unsigned char i;
- while(x--)
- {
- for(i = 0;i < 120;i++);
- }
- }
- //写数据函数
- void write_data(unsigned char addr,unsigned char dat)
- {
- unsigned char i;
- CS = 0; // 先写地址,片选置低,串行数据加载到移位寄存器
- for(i = 0;i < 8;i++) //
- {
- CLK = 0; //时钟上升沿数据移入内部移位寄存器
- addr <<= 1; //待发送的地址,每次左移一次,高位在前发送,
- DIN = CY; //数据移位后,如果有溢出,则可以从进位位CY中获得溢出的数据位
- CLK = 1;
- _nop_();
- _nop_();
- CLK = 0; //下降沿时数据从DOUT移出
- }
- for(i = 0;i < 8;i++)
- {
- CLK = 0; //
- dat <<= 1; //发送数据
- DIN = CY;
- CLK = 1;
- _nop_();
- _nop_();
- CLK = 0;
- }
- CS = 1; //CS上升沿,数据锁存
- }
- //初始化函数
- void init_max7221(void)
- {
- write_data(0x09,0xff); //编码模式
- write_data(0x0a,0x07); //亮度控制
- write_data(0x0b,0x07); //扫描数码管的位数
- write_data(0x0c,0x01); //工作模式
- }
- void main(void)
- {
- unsigned char i;
- init_max7221(); // 初始化
- delayms(2);
- for(i = 0;i < 8;i++)
- {
- write_data(i+1,disp_buff[i]); // 显示8位
- }
- while(1);
- }
复制代码
|