单片机编程问题(C语言),很入门的问题,明天比赛,急急急!多少分都可以 急急急。。。问一下各位编程高手,单片机c语言编程的问题

作者&投稿:凤盼 (若有异议请与网页底部的电邮联系)
下列程序已经调好,按键显示电路可见:
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 = 0; i < x; i++) for(j = 0; j <= 148; j++);
}
/**************************************************************
* 名称: Display(uchar k)
* 功能: 将参数分成十位、个位分别显示
* 输入: k (键盘数值)
* 输出: P0口输出七段码,P2口输出位选码
***************************************************************/
void Display(uchar k)
{
P2 = 0; //消隐
P0 = table[k / 10];
P2 = 0x02; Delay_1ms(5); //显示5ms十位
P2 = 0; //消隐
P0 = table[k % 10];
P2 = 0x01; Delay_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 = 0; j < 4; j++) { //循环四次
P1 = Buffer[j]; //在P1高四位分别输出一个低电平
temp = 0x01; //计划先判断P1.0位
for(i = 0; i < 4; i++) { //循环四次
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;
}
}
/*************************************************************/

调试了好几遍~ 没接口芯片 光单片机好麻烦啊 在我的开发板上调试成功了 12M晶振~~ 既然多少分都可以 那就使劲给吧~

#include <reg52.h>
code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管 0-9

unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
unsigned char second; //秒
char flag;
unsigned char shi;
void delay(unsigned int cnt)
{
while(--cnt);
}

unsigned char keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值并返回
}
}
return(0xff); //否则返回固定值0xff
}

void main()
{
unsigned char key,temp;
TMOD |=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1;
flag=0;
Dis_Shiwei=tab[0];//十位显示值处理
Dis_Gewei=tab[0]; //个位显示处理
while(1)
{
P0=Dis_Shiwei;//显示十位
P2=0xFD;
delay(150);//短暂延时
P0=Dis_Gewei; //显示个位
P2=0xFE;
delay(150);
key=keyscan();//调用键盘扫描,
temp=-1;
if(key!=0xff){
switch(key)
{
case 0x7e:temp=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:temp=1;break;//1
case 0x7b:temp=2;break;//2
case 0x77:temp=3;break;//3
case 0xbe:temp=4;break;//4
case 0xbd:temp=5;break;//5
case 0xbb:temp=6;break;//6
case 0xb7:temp=7;break;//7
case 0xde:temp=8;break;//8
case 0xdd:temp=9;break;//9
case 0xdb:temp=10;break;//a
case 0xd7:temp=11;break;//b
case 0xee:temp=12;break;//c
case 0xed:temp=13;break;//d
case 0xeb:temp=14;break;//e
case 0xe7:temp=15;break;//f
}
if(temp==10)//按下了A键
{
TR0=!TR0;
flag=!flag;
}else
if(flag==1)//按下有效键
{
second=shi*10+temp;
Dis_Shiwei=Dis_Gewei;
Dis_Gewei=tab[temp];
delay(0x7fff); //这个延时太长会在设置时显示不流畅 太短会出现连键
shi=temp;
}
}
}
}

//定时中断
void tim(void) interrupt 1 using 1
{
static unsigned char count;
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second++;//秒减1
if(second>=60)
{
second=0; //减到0是重新赋值
}
Dis_Shiwei=tab[second/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理

}
}

几本书给你
参考资料
1,MSP430系列超低功耗单片机原理与系统设计/李智奇/西安电子科技大学出版社 2008。
2,MSP430单片机C程序设计与实践/曹磊/ 北京航空航天大学出版社 2007。
3,MSP430单片机C语言应用程序设计实例精讲/秦龙/电子工业出版社 2006 。
4,MSP430系列单片机实用C语言程序设计/张晞, 王德银, 张晨/人民邮电出版社 2005。
5,MSP430系列16位超低功耗单片机实践与系统设计/沈建华, 杨艳琴, 翟骁曙/清华大学出版社 2005。
6,MSP430单片机应用系统开发典型实例/秦龙/中国电力出版社 2005。
7,MSP430系列16位超低功耗单片机原理与应用/沈建华, 杨艳琴, 翟骁曙/清华大学出版社 2004。

可以用定时判断A的状态的,一旦按键触发,就停止读秒或数码管清零,等待按键输入,当然,因为你只用到0-9显示,你也可以把A键作为一个特殊键处理的。

还没学单片机!无法回答!

这每一句都是什么意思?单片机编程问题(C语言)~

前四句就是通过typedef来定义自己的类型,定义之后,如果您要在后面定义一个变量比如:unsigned int t;这是发现这样书写起来太麻烦,太长了,而通过typedef定义过以后我们这样定义变量:uint16 t,这样我们就知道t是一个16位的无符号整形数据,书写简单,且将unsigned int的含义表达的清清楚楚,后面的sbit这是一个位定义指令,一般51单片机支持位操作,所以编译器能够识别sbit就是一个位,比如第五句sbit ENLED = P1^4;说明单片机的P1.4接的是38译码器的使能端,假如38译码器是低电平使能有效,通过上面的定义以后我们将ENLED=0;相当于P1.4口拉低从而让使能有效,其实这两部分并不能,只要看看c语言书和单片机的书就明白了,留个QQ以后交流:770368044

你在T2的中断里面写了while(1); 说明已经进入死循环了,那么其它两个定时器是肯定启动不了的。如果你想不影响其它两个定时器,你就得在T2定时中断的程序里面去掉while(1);这个死循环。

单片机编程问题(C语言),很入门的问题,明天比赛,急急急!多少分都可以...
答://单片机:使用51系列兼容的即可;//4×4矩阵键盘:接在P1口;//两位数码显示器: P0口输出七段码,P2口输出位选码。/=== //C语言程序如下。/ 文件名: KEY_LED.c 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。/ include <reg51.h> include <intrins.h> define uint uns...

想玩单片式微型计算机,纯新手,正自学计算机编程C语言,求高手指点!对单 ...
答:FPGA:可编程逻辑阵列的缩写。实际上就是做一个芯片,用软件实现它的内部连接,达到用软件的方法实现硬件的目标。是用硬件实现的一种方法。是早期单片机(功能简单的逻辑应用)的现代实现方法。总结:一个嵌入式软件工程师,其实核心竞争力不是你会运用什么芯片,当你会了一两种以后,再学其他的,就会觉...

C语言—入门技巧大学生推荐
答:C语言入门技巧亲测推荐 技巧 1: 不要使用“GOTO”语句 编程语言终究开始引入了函数的概念,即允许程序对代码进行断行。如果已经完成,不再使用goto语句来表示代码的断行。函数调用后,函数将回到下一条指令。只要看到或想到qoto语句,就会让软件工程师退缩,产生本能 的厌恶。其中一个主要的原因是,一个...

单片机c语言编程?
答:学习单片机C语言,首先要了解这两个东西是什么。单片机入门编程主要是学习C语言,其次是电路和编程语言。单片机C语言程序设计学习中必读的模拟电、数字电、电路三本书,为接下来的学习做铺垫。看书的目的是因为网上教程太多,容易出现偏差。其实只要能懂电路原理,就能开发单片机软件。简介单片机又称单片微...

c语言编程怎样入门
答:(1)基础教材选择-系统又通俗易懂,最好有该书配套免费视频 建议选择系统正统的大学教材,尽量不要选择“多少天精通C语言”等吸引眼球的教程,相信一点C语言学习没有速成。这里给大家推荐一本不错的入门教程:清华大学出版社-孙海洋-C语言程序设计,讲解很透彻、知识点很全面、例程较多且通俗易懂。优酷...

C语言程序设计该如何入门?
答:建议使用Visual C++,这个东西虽然比较大块头,但是一旦安装好了,用起来很方便。 一本学习教程,现在C语言教材多如牛毛,但推荐大家使用《C语言程序设计》谭浩强主编 第二版 清华大学出版社,此书编写的很适合初学者,并且内容也很精到。 除此以外,现在有很多辅助学习的软件,毕竟现在是Window时代了,学习软件多如牛毛,不...

c语言基础知识入门是什么?
答:函数 1、一个源程序由多个函数组成。2、C程序的执行从main()函数开始;3、所有函数都是平行的;4、函数分类;可以分为标准和自定义,还可以分为有参函数和无参函数。七、指针 指针是指向一片内存空间的地址,指针变量是变量,是存放一片内存空间首地址的变量,我们一般所说的指针都是指针变量。

单片机入门,急求高手大虾指教!!!
答:学习单片机首先应该对数电、模电有一定的了解,还有C语言,刚开始入门的话建议用C语言,当然课本也是少不了的,看看单片机的基本的东西。数电:《数字电子技术基础》 主编:阎石模电:《电子技术基础》 主编:康华光C语言:《C程序设计》 编著:谭浩强单片机的书你在网上查查,我们用的是《单片机基础与最小系统实践》——北...

编程入门先学什么
答:编程入门先学C语言或者python。为了解决使用机器语言编写应用程序所带来的一系列问题,人们首先想到使用助记符号来代替不容易记忆的机器指令。这种助记符号来表示计算机指令的语言称为符号语言,也称汇编语言。在汇编语言中,每一条用符号来表示的汇编指令与计算机机器指令一一对应;记忆难度大大减少了,不仅...