码迷,mamicode.com
首页 > 其他好文 > 详细

准备用C51做个学生管理系统(1)

时间:2014-07-26 00:42:26      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   数据   io   width   2014   

为了做这个看起来很容易,做起来很麻烦的基于51的学生管理系统,我得准备很多的知识,首先是51单片机的一些IO、定时器差不多就可以了,硬件方面还要有数码管、LCD1602、矩阵键盘等知识,至于代码就需要数据结构双向链表的知识就差不多了,用到的软件无非也就是protues、keil、protel这三剑客了。

1、为什么要用到数码管呢,因为很少做这些硬件的东西,用数码管主要是为了验证我的矩阵键盘功能有没有用罢了,数码管的abcdefg对应那几根“杠杠”的亮否可以直接显示亮的数据,因为矩阵键盘是8X8的,所以用两端数码管,那就还得设计数码管扫描的知识了。

2、IO口的P1和P3连接上8X8矩阵键盘,可能单面PCB板做起来会吃力一点,我考虑到时候学一学双面板的布线。

3、以上都搞清楚后把接数码管的P0口和P2接上LCD屏所需要连端口上,验证代码是否能够正常运行。

4、最后就是关于内存扩展方面了,初步准备用SD卡来扩充。

 

bubuko.com,布布扣

 

简单画了一副4X4的图后就着手写代码,代码如下:

 

 

  1 #include <reg52.h>
  2 
  3 #define uint unsigned int
  4 #define uchar unsigned char
  5 
  6 uchar code digitalSeg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
  7 uchar num = 0,cnt = 0;
  8 uchar pre_num = 16, now_num = 16;
  9 
 10 /*定时器的初始函数*/
 11 void init()
 12 {
 13     TMOD = 0x10;
 14     TH1 = (65535 - 46080) / 256;
 15     TL1 = (65535 - 46080) % 256;
 16     EA = 1;
 17     ET1 = 1;
 18 }
 19 /*延时*/
 20 void delay(uint i)
 21 {
 22     uint j;
 23     for(i; i > 0; i--)
 24         for(j = 0; j < 120; j++);
 25 }
 26 /*动态数码增加*/
 27 void display_seg(uint i)
 28 {
 29     uint shi = i/10;
 30     uint ge = i%10;
 31     delay(1);
 32     P2 = 0X01;
 33     P0 = ~digitalSeg[shi];
 34     delay(1);
 35     P2 = 0X02;
 36     P0 = ~digitalSeg[ge];
 37     delay(1);
 38     P0 = 0xff;    
 39 }
 40 /*键盘扫描*/
 41 void keyscan()
 42 {
 43     uchar tmp;
 44     P1 = 0x0f;
 45     delay(1);
 46     tmp = P1^0x0f;
 47 
 48     switch(tmp){
 49     case 1:
 50         now_num = 0;
 51         break;
 52     case 2:
 53         now_num = 1;
 54         break;
 55     case 4:
 56         now_num = 2;
 57         break;
 58     case 8:
 59         now_num = 3;
 60         break;
 61     default:
 62         now_num = 16;
 63     }
 64 
 65     P1 = 0xf0;
 66     delay(1);
 67     tmp = P1>>4^0x0f;
 68     switch(tmp){
 69     case 1:
 70         now_num += 0;
 71         break;
 72     case 2:
 73         now_num += 4;
 74         break;
 75     case 4:
 76         now_num += 8;
 77         break;
 78     case 8:
 79         now_num += 12;
 80     }
 81 }
 82 /*数码管数字变换*/
 83 void show()
 84 {
 85     if(pre_num != now_num)    
 86     {
 87         display_seg(now_num);
 88         pre_num = now_num;
 89     }
 90     display_seg(now_num);
 91     //delay(100);
 92 }
 93 
 94 //主函数
 95 void main()
 96 {
 97     int i = 0;
 98     int j = 0;
 99 
100     P0 = 0xff;
101     P2 = 0;
102     init();
103     TR1 = 1;
104 
105     cnt = 00;
106     while(1)
107     {
108            //display_seg(cnt);
109         P1 = 0xf0;
110         if(P1 != 0xf0)keyscan();
111         show();
112     }    
113 }
114 /*定时中断*/
115 void T1_time() interrupt 3
116 {
117     TH1 = (65535 - 46080) / 256;
118     TL1 = (65535 - 46080) / 256;
119     num++;
120     if(num == 20)
121     {
122         num = 0;
123         cnt++;
124     }
125 }

display_seg主要是为了了解一下数码管扫描的原理,然后才可以4X4矩阵控制显示数据的变换,观察是否能控制每个键盘。

准备用C51做个学生管理系统(1),布布扣,bubuko.com

准备用C51做个学生管理系统(1)

标签:style   blog   http   color   数据   io   width   2014   

原文地址:http://www.cnblogs.com/songsongman/p/3868396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!