还有:
uchar code table[]={ //显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}
也应该在后面加个分号!!
你的分不好拿啊,该用分号的不用,不该用的地方用了,还有括号你用了很多中文的括号。
现在帮你改了,你自己好好对一下了,反正编译通过了,运行结果你自己看吧,我没你的目标板,运行不了。
#include<reg51.h>
#define uchar unsigned char//宏定义
#define uint unsigned int
sbit dula=P2^6//段控制位
sbit wela=P2^7//位控制位
uchar miao,fen,aa,n1,n2,n3,n4
uchar code table[]={ //显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}
void delay(uint z)//延时程序声明
void init(void)//初始化程序声明
void display(uchar n1 ,uchar n2,uchar n3,uchar n4)//显示程序声明
void main() //主程序
{
init()//调用初始化程序
while(1) //进入大循环
{
if(aa==20) //判断是否到了1S
{
miao++//秒数加1
if(miao==60) //判断是否到了60秒
{
miao=0//秒数清0
fen++//分数加1
if(fen==60) //判断是否到了60分
{
fen=0//分数到60则清0
}
n1=fen/10//第一个数码管显示分的十位
n2=fen%10//第二个数码管显示分的个位
n3=miao/10//第三个数码管显示秒的十位
n4=miao%10//第四个数码管显示秒的个位
}
display(n1,n2,n3,n4)
}
}
}
void delay(uint z) //延时程序
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
void display(uchar n1 ,uchar n2,uchar n3,uchar n4)
{
dula=1//开段选
P0=table[n1]//送分的十位
dula=0//关段选
P0=0xff//消隐
wela=1//开位选
P0=0xfe//选通分的十位
wela=0//关位选
P0=0xff//消隐
delay(1)//延时
dula=1//开段选
P0=table[n2]//送分的个位
dula=0//关段选
P0=0xff//消隐
wela=1//开位选
P0=0xfd//选通分的个位
wela=0//关位选
P0=0xff//消隐
delay(1)//延时
dula=1//开段选
P0=table[n3]//送秒的十位
dula=0//关段选
P0=0xff//消隐
wela=1//开位选
P0=0xfb//选通秒的十位
wela=0//关位选
P0=0xff//消隐
delay(1)//延时
dula=1//开段选
P0=table[n4]//送秒的个位
dula=0//关段选
P0=0xff//消隐
wela=1//开位选
P0=0xf7//选通秒的个位
wela=0//关位选
P0=0xff//消隐
delay(1)//延时
}
void init(void)
{
}
void timer0(void) interrupt 1 using 1
{
TH0=(65536-50000)/256//求模
TL0=(65536-50000)%256//求余
aa++
}
我本来想帮你详细注释下,但是你这个排版确实很痛苦,我不想整理了。其实任何应用程序的入口都是main()函数(汇编语言除外)
你这个程序无非就是一个51单片机上闪8段数码管,很简单的。
在main()中
先初始化了 timer0 ,你玩单片机,你知道什么是timer,而且这里是闪8段数码管,那也应该知道为啥要初始化一个tiemr,而不是I/O, uart spi之类的东西
然后就是一个死循环,在循环中先检测是否有按键按下,如果有按键按下,数码管该什么样的动作,如果没有按键按下,数码管又该是什么样的动作。
你先看看吧,如果不行的话追问,明天去linux下把这个代码排排版注释下就OK了。
玩嵌入式程序,先把硬件原理搞明白,把硬件逻辑搞明白,然后看代码从main()开始看即可。
下列程序已经调好,按键显示电路可见:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ef086222268d4f4eac34de59.html
//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//两位数码显示器: P0口输出七段码,P2口输出位选码。
/========================================
//C语言程序如下。
/*************************************************************
* 文件名: KEY_LED.c
* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
**************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}
uchar sec, t_50ms
/**************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***************************************************************/
void Delay_1ms(uint x)
{
uint i
uchar j
for(i = 0i <xi++) for(j = 0j <= 148j++)
}
/**************************************************************
* 名称: Display(uchar k)
* 功能: 将参数分成十位、个位分别显示
* 输入: k (键盘数值)
* 输出: P0口输出七段码,P2口输出位选码
***************************************************************/
void Display(uchar k)
{
P2 = 0 //消隐
P0 = table[k / 10]
P2 = 0x02Delay_1ms(5) //显示5ms十位
P2 = 0 //消隐
P0 = table[k % 10]
P2 = 0x01Delay_1ms(5) //显示5ms个位
}
/**************************************************************
* 名称: Keyscan()
* 功能: P1外接4×4按键, 按照扫描法读出键值
* 输出: 按键值0~15/如无键按下, 返回16
***************************************************************/
uchar Keyscan(void)
{
uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}
for(j = 0j <4j++) { //循环四次
P1 = Buffer[j]//在P1高四位分别输出一个低电平
temp = 0x01 //计划先判断P1.0位
for(i = 0i <4i++) { //循环四次
if(!(P1 &temp)) //从P1低四位,截取1位
return (i + j * 4)//返回取得的按键值
temp <<= 1 //判断的位,左移一位
} }
return 16 //判断结束,没有键按下,返回16
} //呵呵,实质性的语句不过8行,就是这么简练!
/**************************************************************
* 名称: GetKey()
* 功能: 读出按键、消抖、等待按键释放
* 输出: 按键值0~15/如无键按下, 返回16
***************************************************************/
uchar GetKey(void)
{
uchar Key_Temp1, Key_Temp2//两次读出的键值
P1 = 0xff
Key_Temp1 = Keyscan() //先读入按键
if(Key_Temp1 == 16) return 16//没有键按下,返回16
Display(sec) //用显示代替延时
Key_Temp2 = Keyscan() //再读一次按键
if(Key_Temp1 != Key_Temp2) return 16//不同,返回16
while(Keyscan() <16)//等待按键释放
Display(sec) //等待期间显示
return Key_Temp1
}
/**************************************************************
* 名称 : Main()
* 功能 : 主函数
***************************************************************/
void Main(void)
{
uchar Key_Value //读出的键值
sec = 0
TMOD = 0x01
TH1 = (65536-50000)/256
TL1 = (65536-50000)%256
TR0 = 1
ET0 = 1
EA = 1
while(1) {
Display(sec) //显示
if (GetKey() == 10) {
TR0 = 0
while (TR0 == 0) {
Display(sec) //显示
Key_Value = GetKey()
if (Key_Value <10) {
sec %= 10
sec = sec * 10 + Key_Value
}
if (Key_Value == 10) TR0 = 1
} } }
}
/**************************************************************
* 名称 : T0_INT()
* 功能 : T0中断函数
***************************************************************/
void T0_INT() interrupt 1
{
TH1 = (65536-50000)/256
TL1 = (65536-50000)%256
t_50ms++
if(t_50ms >= 20) {
t_50ms = 0
sec++
sec %= 60
}
}
/*************************************************************/