#include #include #define nop _nop_(); #define uchar unsigned char #define uint unsigned int sbit stb =P1^0;//定义片选通讯口 sbit clk =P1^1;//定义时钟通讯口 sbit dio =P1^3;//定义数据输入/输出通讯口 bdata unsigned char y;//定义可以位寻址的两个全局变量 sbit y7=y^7; uchar show_L; //----------给IC写数据(包括8位数据,ACK应答信号)-- void write(uchar wr_data) { unsigned int i,count1; for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据 { clk =0; nop; nop; wr_data >>= 1;//移位数据,低位在前! nop; dio = CY; nop; nop; clk =1; nop; nop; } //8位数据传送完1 clk = 0;//判断芯片发过来的ACK应答信号 nop; nop; dio = 1; nop; nop ; clk = 1; nop; nop; while(dio) { count1 +=1; if(count1 ==200) { dio =0; count1 =0; } } nop; nop; //ACK应答信号 } //---------读按键数据子程序----------- unsigned char read() { uchar count,x; nop; nop; clk = 0; for(x=0;x<8;x++) //读按键数据开始 { clk = 0; nop; if(dio==1) { y7 = 1; } else { y7 = 0; } clk = 1; nop; nop; if(x!=7){y=(y>>1);}//读按键时,不需要开始信号,直接读8位数据。 } clk = 0; nop; nop; dio = 1; nop; nop ; clk = 1; nop; nop; nop; while(dio) { count +=1; if(count ==200) { dio =0; count =0; } } nop; nop; //ACK应答信号 return(y); } //---------开始信号------------------ void start() { clk = 1;//给芯片发送开始信号 dio = 1; nop; nop; dio = 0; nop; nop ; clk = 0;//开始信号传送完 nop; } //---------结束信号------------------- void stop() { clk = 0; nop; nop; dio = 0; nop; nop; clk = 1; nop; nop; nop; dio = 1; } //----------显示子函数------------ void xianshi(uchar SHOW_L) { uchar a=0; dio = 1; clk = 1; start(); //调用开始信号 write(0x40);//写命令40H(数据设置),地址自动加一 stop(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令 nop; nop; nop; nop; start(); //调用开始信号 write(0xc0);//写起始地址命令(0C0H),地址从00H单元开始。 for(a=0;a<6;a++) { write(SHOW_L);//给显示寄存器写显示数据,值可根据实参改变 } stop(); //将所有数据送完后,发结束信号,可以发送下一条命令 nop; nop; nop; start(); //调用开始信号 write(0x8b); //送开屏命令,(8BH),亮度可以根据低三位调节。 stop(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令 } void main() { P1=0x ff;//初始化单片机I/O口 xianshi(show_LED); } }下载本文