|
深圳赛元的单片机,一个是SC92F7352,一个是SC92F7422。两个单片机的引脚基本一致,可做之间替换。我从网上扒了一个TM1623的例程,直接套上去用。一共驱动7个数码管。9个按键。
一开始用7352,LED正常,但是按键一直不好使,串口打印出来,返回的数值都是0xFF。完全不带变化的。找了好久问题,没找到。后来换了个单片机(7422),发现一切正常了。看了好久规格书,还是不太明白有什么可以导致这样的区别。希望有大佬看看,我的见识不够,看不出来。
#define uchar unsigned char //数据类型宏定义
#define uint unsigned int //数据类型宏定义
#define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//宏定义
/********************定义数据*************************/
uchar CODE[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴数码管0~9字型码
uchar TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //共阴数码管无显示字型码
uchar CCC1[10]={0x3F};
uchar CCC2[10]={0x00,0x06};
uchar CCC3[10]={0x00,0x00,0x5B};
uchar CCC4[10]={0x00,0x00,0x00,0x4F};
uchar KEY[5]={0}; //为存储按键值定义的数组
/***************延时函数nms**************/
void delay_nms(uint n)
{
uint i;
while(n--)
{
for(i=0;i<550;i++);
}
}
/***************发送8bit数据,从低位开始**************/
void send_8bit(uchar dat) //发送8位数据,从低位开始
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
if(dat&0x01)
DIO=1;
else
DIO=0;
_nop_();
_nop_();
_nop_();
CLK=1;
dat>>=1;
}
CLK=0;
DIO=0;
}
/******************发送控制命令***********************/
void send_command(uchar com) //发送命令字节
{
STB=1; //STB置高
nop;
STB=0; //STB置低
send_8bit(com); //发送8bit数据
}
/****************读取按键值并存储*******************/
void read_key(void) //读取5字节按键值并存入数组KEY[],从低字节、低位开始
{
unsigned char i,j;
send_command(0x42); //发送读按键命令
DIO=1; //释放DIO数据总线
for(j=0;j<5;j++) //连续读取5个字节
{
for(i=0;i<8;i++)
{
CLK=0;
KEY[j]=KEY[j]>>1;
CLK=1;
if(DIO==1)
{
KEY[j]=KEY[j]|0x80;
}
nop;
}
nop;
nop;
}
CLK=0;
DIO=0;
STB=1;
}
/************显示函数,数码管1~7位显示0~6************/
void display(uchar *p) //显示函数,1~7位数码管显示0~6
{
uchar i;
send_command(0x03); //设置显示模式,7位10段模式
send_command(0x40); //设置数据命令,采用地址自动加1模式
send_command(0xc0); //设置显示地址,从00H开始
for(i=0;i<7;i++)
{
send_8bit(*p); //从00H开始,偶数地址送显示数据
send_8bit(0x00); //因为SEG9-14未用到,所以奇数地址送全0
p++;
}
send_command(0x8F); //设置显示命令,打开显示并设置占空比14/16.
STB=1;
}
/*****************按键处理函数*********************/
void key_process() // 按键处理函数
{
if(KEY[0]!=0x00)
{
if((KEY[0]==0x01)) {display(CODE);} //A
if((KEY[0]==0x02)) {display(TAB);}//B-void
if((KEY[0]==0x04)) {display(CCC1);}//C-0
if((KEY[0]==0x08)) {display(CCC2);}//32-1
if((KEY[0]==0x10)) {display(CCC3);}//31-2
if((KEY[0]==0x20)) {display(CCC4);}//22-3
}
}
void main()
{
IO_Init();
display(CODE); //上电显示0~6
delay_nms(1);
while(1)
{
read_key(); //读按键值
key_process(); //按键处理
delay_nms(200); //延时200ms再读按键
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|