单片机的课程设计——在8*8点阵显示图形

单片机的课程设计——在8*8点阵显示图形,第1张

这个问题不是很难!

我的理解是楼主可能只用单片机和点阵模块来实现,这需要单片现来做动态扫描。

首先需要你把点阵上要显示图形的代码写出来,即每种图形每行显示的数据,每个图形有8行数据,即占8个字节的空间!

如果楼主用51单片机来实现的话,可以使用P0口输出行数据,P1口作为点阵的行扫描控制。

其次要用按键控制,只需你把每种图形以不同的表存起来,再做一个按键扫描程序,当检测到有键按下时,把动态扫描的表头地址更换即可!

楼主的那个程序我看不太懂:不过根据你的大概意思更改了一下程序,希望对你有帮助!下面是我的程序代码:

/********************************************************************

* 文件名  : 矩阵键盘.c

* 描述    :  该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示

 当前的按键值。

*********************************************************************/

#include<reg51.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[16] = {0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71} //用于数码管显示 本程序未用

uchar Key  //读出的键值

/********************************************************************

* 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x

* 输入 : x (延时一毫秒的个数)

* 输出 : 无

***********************************************************************/

void Delay_1ms(uint i)//1ms延时

{

uchar x,j

for(j=0j<ij++)

for(x=0x<=148x++)

}

/********************************************************************

* 名称 : delay()

* 功能 : 延时,延时时间大概为140US。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay()

{

int i,j

for(i=0 i<=10 i++)

for(j=0 j<=2 j++)

}

/********************************************************************

* 名称 : Keyscan()

* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。

* 输入 : 无

* 输出 : 按键值

***********************************************************************/

uchar Keyscan(void)

{

uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}

for(j=0 j<4 j++)

{

P1 = Buffer[j]

temp = 0x01

for(i=0 i<4 i++)

{

if(!(P1 & temp))

{

return (i+j*4)   //这里返回的是按键牌排列值!

}

temp <<= 1

}

}

}

/********************************************************************

* 名称 : InitTimer0()

* 功能 : 用于定时器初始化。

* 输入 : 无

* 输出 :

***********************************************************************/

unsigned int Timer_1s=0//定时器中断响应次数变量

//定时时间长度=定时中断响应时间*定时中断响应次数

void InitTimer0()

{

//    AUXR=0x80  //定时时钟为Sysclk,即晶振时钟 实用于具有单时钟周期的单片机系列

//特别的还需要注意时钟设置在其它模块中的设置,如波特率的定时器1时钟设置

TMOD = 0x21 //定时器0工作于方式1,,16位定时,定时器1为波特率发生器

//特别地,高四位控制定时器1,低四位控制定时器0,

//所以此处需要注意程序中是否并存定时器1工作,如串口就需要定时1的设置为TMOD=0x20

TH0 = 0x0B8 //定时装如初值   //定时1000us 即1ms

TL0 = 0x00 //定时其它值可由需要重新计算初值

ET0 = 1 //允许中断

TR0 = 1 //启动定时器

}

/********************************************************************

* 名称 : Timer0Interrupt()interrupt 1

* 功能 : 定时器中断。

* 输入 : 无

* 输出 :

***********************************************************************/

void Timer0Interrupt() interrupt 1

{

TR0 = 0 //关闭定时器

TH0 = 0x0B8 //重装初值

TL0 = 0x00

Timer_1s++ //中断响应次数自加1

if(Timer_1s=20) //可以在此处调节按键的扫描时间

{

/*一下是扫描按键并带返回值的结果*/

P1 = 0xf0

if(P1 != 0xf0)

{

Delay_1ms(15) //按键消抖

if(P1 != 0xf0)

{

Key = Keyscan()

}

}

}

TR0 = 1 //启动定时器

}

/********************************************************************

* 名称 : Main()

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Main(void)

{

InitTimer0()//初始化定时器

EA =1       //开中断

while(1)

{

switch (Key) //判断键值(那一个键按下)

case 0: /*加入需要执行该按键下的程序*/ break  //假设0号按键被按下

case 1: /*加入需要执行该按键下的程序*/ break

case 2: /*加入需要执行该按键下的程序*/ break

case 3: /*加入需要执行该按键下的程序*/ break

case 4: /*加入需要执行该按键下的程序*/ break

case 5: /*加入需要执行该按键下的程序*/ break

case 6: /*加入需要执行该按键下的程序*/ break

case 7: /*加入需要执行该按键下的程序*/ break

case 8: /*加入需要执行该按键下的程序*/ break

case 9: /*加入需要执行该按键下的程序*/ break

case 10: /*加入需要执行该按键下的程序*/ break

case 11: /*加入需要执行该按键下的程序*/ break

case 12: /*加入需要执行该按键下的程序*/ break

case 13: /*加入需要执行该按键下的程序*/ break

case 14: /*加入需要执行该按键下的程序*/ break

case 15: /*加入需要执行该按键下的程序*/ break 

default: break

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11887788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存