当前位置:编程学习 > C/C++ >>

51单片机主c语言程序,求高手教教!1!

程序流程图是这个,怎么写C语言程序啊??  好的话可以加分
追问:不需要数码管显示,只是执行对应的子程序  是不是把数码管显示那里去掉就行了?  还有去抖动延时是25ms?

答案:下面的程序是我这里的板子的按键扫描程序。你可以参考下。

#include"at89x52.h"
#define uchar unsigned char
//键盘扫描码
//键值    0      1    2    3    4    5    6    7
const uchar keyboard[16]    =
{
    0x7e,
    0xbe,
    0xde,
    0xee,
    0x7d,
    0xbd,
    0xdd,
    0xed,
    //键值    8    9    a      b    c      d    e    f
    0x7b,
    0xbb,
    0xdb,
    0xeb,
    0x77,
    0xb7,
    0xd7,
    0xe7
};
//显字符示数码  0    1      2    3    4    5    6    7
const uchar number[16]      =
{
    0x3f,
    0x06,
    0x5b,
    0x4f,
    0x66,
    0x6d,
    0x7d,
    0x07,
    //      8      9    a    b    c    d    e    f
    0x7f,
    0x6f,
    0x77,
    0x7c,
    0x39,
    0x5e,
    0x79,
    0x71
};
uchar       count= 0x00;
uchar       temp;


void print(uchar scankey);
uchar Scan();      //逐列扫描


/******************************************************************************
名称:timer0_over
功能:定时器/计数器 0 溢出中断服务程序,每 0.025s 显示一次扫描的按键;每 0.5 秒扫描键盘
一次
参数:无
******************************************************************************/
void timer0_over(void) interrupt 1
{
    count++;      //计数一次
    if (count == 0x14)
    {
    count = 0x00;
    temp = Scan();     //列扫描
    }
    if (temp != 0xff)//如果有键按下
    {
    print(temp);       //输出该字符
    }
    TH0 = 0x3c;    //设置定时器 0 初始值
    TL0 = 0xaf;      //为 0x3caf
}




/******************************************************************************
名称:Scan()
功能:逐列扫描键盘,有键按下返回扫描码,无键按下返回 0xff
返回值:0xff,或键盘扫描码
******************************************************************************/
uchar Scan(void)
{
    ucharscantemp, m;
    static uchar    n   = 0x00;


    P2 = 0xff ^ (0x01 << n);     //逐次对每列输出低电平
    scantemp = P2;      //读取 P2
    if (scantemp < 0xf0)//有键按下
    {
    for (m = 0x00; m < 0x10; m++)
    {
 if (scantemp == keyboard[m])      //找到对应的键盘?
 {
     return m; //有键按下,返回键值
 }
    }
    }
    n++;    //扫描下一列
    if (n == 0x04)
    {
    n = 0x00;
    }
    return 0xff;      //无键按下,返回 0xff
}


/******************************************************************************
名称:device_init(void)
功能:初始化端口、状态寄存器
参数:无
******************************************************************************/
void device_init(void)
{
    TH0 = 0x3c;    //设置定时器 0 初始值为 0x3caf
    TL0 = 0xaf;      //即每次定时 50000*0.5um=0.025s
    TMOD = 0x01;    //设置定时器 0 的工作方式为 1
    TCON = 0x10;      //定时器 0 工作
    IE = 0x82;   //打开全局中断和定时器 0 溢出中断
}
/******************************************************************************
名称:print(uchar scankey)
功能:将一个键值显示到数码管上
参数:scankey,表示要显示的键值
******************************************************************************/
void print(uchar scankey)
{
    P1 = 0xdf; //在第一个数码管上
    P0 = number[scankey];   //显示出该键值
}




void main()
{
    device_init();    //调用初始化函数
    while (1) //等待中断
    {
    }
}
点击Project菜单,选择弹出的下拉式菜单中的New Project,
QQ:349836971

上一个:C语言J++和++J又什么区别?
下一个:c 语言 写个超市管理系统。。简单的功能

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,