#define key 4
#define dissetmode 0x03 //显示模式设置
#define writedatamode_z 0x40 //采用地址自动加一方式写显存
#define writeledmode_z 0x41 //采用地址自动加一方式写LED显存命令
#define readkeymode 0x42 //读按键命令
#define writedatamode_g 0x44 //采用固定地址方式写显存
#define writeledmode_g 0x45 //采用固定地址方式写LED显存命令
#define startaddress 0xC0 // 起始地址
//#define disconmode 0x8b // 显示控制
#define disconmode_slp 0x89 // 睡眠设定一分钟后的显示控制 ,亮度减半
#define datacount 0x8 //采用地址自动加一方式传输数据的个数
extern void indate(unsigned char p);
extern void indate2(unsigned char p);
extern void indate3(unsigned char p);
extern void display(unsigned char disa);
extern void fortime(void);
extern unsigned char outdate();
extern void writeTM(void);
extern void display_TM(unsigned char disa);
TYPE_BYTE k1,k2,k3,k4,k5; //按键值寄存器
#define STB_on P3_1 = 1
#define STB_off P3_1 = 0
#define CLK_on P3_0 = 1
#define CLK_off P3_0 = 0
#define DIO_on P3_2 = 1 /* P1.2 */
#define DIO_off P3_2 = 0 /* P1.2 */
#define DIOinbt P3_2 /* P1.2 */
#define DIO_DO P3D_2 = 1 /* 输出 */
#define DIO_DI P3D_2 = 0 /* 输入 */
/*********************自己添加一个微秒级延迟******************************/
void _delay_us(uint16 z)//延迟z微秒
{
uint16 i,j;
for(i=z;i>0;i--)fortime();
}
unsigned char outdate(void)
{
unsigned char i,k;
k = 0;
DIO_DI;//DIO_D = 0; //释放DIO为输入
STB_off;//STB = 0; //保证“STB”为低电平
for(i = 0;i<8;i++)
{
CLK_on;//CLK = 0;
_delay_us(4);
CLK_off;//CLK = 0;
_delay_us(4);
k = k>>1;
if(DIOinbt == 0) //读通讯数据口
{
k = k&0x7f; //如果“DIO”为低电平,则把K的最高位清0
}
else
{
k = (k|0x80); //如果“DIO”为高电平,则把K的最高位置1
}
//CLK_on;//CLK = 1; //送时钟的上升沿
} //送完一个字节后退出循环
return(k); //返回读到的1字节数据
}
unsigned char keyscan(void)
{
STB_on;//STB = 1;
indate(readkeymode); //设置为读按键命令
//indate(0); //设置为读按键命令
//根据IC型号读指定字节,不允许多读,否则会造成读按键不稳定
k1.byte = outdate();
k2.byte = outdate();
k3.byte = outdate();
k4.byte = outdate();
STB_on;//STB = 1;
return 0;
}
//写入一个字节(8bit)
//在时钟的上升沿通过MCU向LED驱动IC
void indate(unsigned char p)
{
unsigned int i;
DIO_DO;//DIO_D = 1; //输出
STB_off;//STB = 0; //保证"STB"为低电平,程序不依赖之前端口的状态
//CLK_off;//CLK = 0; //先将"CLK"清零
for(i = 0;i<8;i++)
{
// CLK_off;//CLK = 0; //先将"CLK"清零
//_delay_us(2);
// CLK_on;//CLK = 1; //送时钟的上升沿
//_delay_us(2);
if((p & 0x01)!= 0)
{
DIO_on;//DIO = 1; //需传送数据的低位为“1”
}
else
{
DIO_off;//DIO = 0; //需传送的数据的地位为“0”
}
CLK_off;
_delay_us(4);
p = p>>1; //准备送下一个BIT
CLK_on;_delay_us(4);
}//送完一个字节后退出循环
//DIO_off;//DIO = 0;
}
////采用地址自动加1方式传输地址和数据开始
////先关闭显示,否则会出现乱码
//void display_TM(unsigned char disa)
//{
// unsigned char i;//控制本次需传多少个字节显示数据
// DIO_D = 1; //输出
// //DIO = 1;
// CLK = 1;
// STB = 1; //通讯开始前通讯端口全部初始为1
// indate(writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据
// STB = 1; //设置命令传完后需将STB置1
// indate(startaddress); //传起始地址
// for(i = 0;i<datacount;i++) //地址传完后,“STB”保持为0继续传需要显示的数据
// {
// indate(disa);
// }
// STB = 1;
// indate(disconmode); //传显示控制命令
// STB = 1;
//}
//////采用地址自动加1方式传输地址和数据开始
//////先关闭显示,否则会出现乱码
//void display_TM2(unsigned char disa)
//{
// unsigned char i;//控制本次需传多少个字节显示数据
// DIO_D = 1; //输出
// //DIO = 1;
// CLK = 1;
// STB2 = 1; //通讯开始前通讯端口全部初始为1
// indate2(writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据
// STB = 1; //设置命令传完后需将STB置1
// indate2(startaddress); //传起始地址
// for(i = 0;i<datacount;i++) //地址传完后,“STB”保持为0继续传需要显示的数据
// {
// indate2(disa);
// }
// STB2 = 1;
// indate2(disconmode); //传显示控制命令
// STB2 = 1;
//}
//
//////采用地址自动加1方式传输地址和数据开始
//////先关闭显示,否则会出现乱码
//void display_TM3(unsigned char disa)
//{
// unsigned char i;//控制本次需传多少个字节显示数据
// DIO_D = 1; //输出
// //DIO = 1;
// CLK = 1;
// STB3 = 1; //通讯开始前通讯端口全部初始为1
// indate3(writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据
// STB3 = 1; //设置命令传完后需将STB置1
// indate3(startaddress); //传起始地址
// for(i = 0;i<datacount;i++) //地址传完后,“STB”保持为0继续传需要显示的数据
// {
// indate3(disa);
// }
// STB3 = 1;
// indate3(disconmode); //传显示控制命令
// STB3 = 1;
//}
//采用地址自动加1方式传输地址和数据开始
//先关闭显示,否则会出现乱码
void display_TM(unsigned char disa)
{
unsigned char i;//控制本次需传多少个字节显示数据
if(scandisms>2)
{
scandisms = 0;
DIO_DO;//DIO_D = 0; //输入
//DIO = 1;
STB_on;//STB = 1;
//CLK_on;//CLK = 1; //通讯开始前通讯端口全部初始为1
indate(writedatamode_z); //传数据设置命令,设置采用地址自动加1方式写显示数据 2
STB_on;//STB = 1; //设置命令传完后需将STB置1
indate(startaddress); //传起始地址 3
for(i = 0;i < datacount;i++) //地址传完后,“STB”保持为0继续传需要显示的数据
{
indate(disa);
}
STB_on;//STB = 1;
indate(0); // 1
// CLK_on;//CLK = 1;
STB_on;//STB = 1;
indate(disconmode); //传显示控制命令
STB_on;//STB = 1;
}
}