用51做的16*16点阵显示屏幕(ptotues仿真)

第一次写博客,来试试水。正好前几天搞一个单片机的仿真拿来分享

16*16的点阵显示屏,按下开始按键后,在显示屏上轮流显示“字符串1”字样。再次按下开始按键后,显示屏上无任何显示。按下切换后能显示“字符串2”字样等(可以设计很多切换字符串)。且启动消隐的过程显示清晰无异样。

/* ***************************************************** */
// 作  者:lk			系统时钟 : 11.0592MHZ
// 版  本:V1.2       		生成日期 : 2018-12-01
// 简单描述 : 用8255和74ls154驱动16*16点阵,
// 字幕软件:Copyleft采用纵向取模,字节倒序,字体:宋体12
//switch按键切换字符组,start按键用来启动和关闭点阵显示。
/* ***************************************************** */
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int

//PA,BP,PC端口地址及命令定义 按键定义
#define PA XBYTE[0x0000]
#define PB XBYTE[0x0001]
#define PC XBYTE[0x0002]
#define COM XBYTE[0x0003]

sbit sz_anji = P3^3;    //切换按键
sbit ks_anji = P3^2;		//开关按键
sbit switch_154 = P3^0;					//74ls154译码开关
uchar shuzu=0;				  	//当前数组号
uchar BR=0;				  	//跳出信号
uint qh=0;						//切换数组按键变量
uchar dz_start = 0;									//启动标志位
uchar data Row_Data[32];  			//发送4片LED屏数据
uchar code Word_Set1[][32]= 			//待显示文字的点阵
{
{/*--  文字:  电  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},
{/*--  文字:  信  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x04,0x00,
0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xF9,0x49,0x49,0x49,0x49,0x49,0xF9,0x00,0x00},
/*省略一部分字符代码*/};

void delay(uint x)					//延时函数
{
	uchar i;
	while(x--)
		for(i=0; i<120; i++);
}

void clear(void)      //清屏函数
{
	switch_154 = 1;		//关闭列译码器
	PA = 0xff;			  //清零上8行数据
	PB = 0xff;			  //清零下8行数据
	switch_154 = 0;		//打开列译码器
}

void switch_sz(uint xh)     //切换按键判断函数
{
	uint x;
	for(x=0;x<xh;xh++)
	{
		if(!sz_anji)
		{
			delay(10);	//按键消抖
		 if(!sz_anji)
			{
				TR0 = 0;					//关闭定时器不再刷新
				clear();					//消隐
				qh++;		shuzu=qh%3;  //获取当前数组号
				 BR=1;
			  while(!sz_anji);		//按键弹起后
			}
		}
	}
}

//定时器0中断,在主程序的延时时期内以1ms的间隔动态显示每列数据
void led_disply_control() interrupt 1
{
		uchar i;
		TH0 = ~1000/256;
		TL0 = ~1000%256;
		switch_154 = 1;					//关闭列译码器
		i = (P1+1) & 0X0F;			//列号递增
		PA = ~Row_Data[i];			//发送上8行数据
		PB = ~Row_Data[i+16];		//发送下8行数据
		P1 = i;									//列译码
		switch_154 = 0;					//打开列译码器
}

//按键外部中断处理程序
void Key_Down() interrupt 0
{
	TR0 = 0;								//关闭定时器刷新
	EX0 = 0;								//关闭外部中断

	delay(10);								//按键消抖
	if(!ks_anji)									//按键按下
	dz_start = !dz_start;			//改变启动状态位	

	TR0 = 1;						  //打开定时器继续刷新
	EX0 = 1;							//开启外部中断
}

void main ()
{
	uchar i,K;								//刷新变量
	uchar qs,mw;					//数组起始,末尾位

	//8255工作方式选择PA,PB均输出,工作方式0
	COM = 0x80;
	TMOD = 0x01;
	TH0 = ~1000/256;
	TL0 = ~1000%256;
	IT0 = 1;							//下降沿触发
	IE = 0x83;
	P1 = 0xFF;
	sz_anji = 1;

	while(1)
	{
		if(dz_start)						//是否start
		{
			BR=0;
			switch(shuzu)					//数组起始和末尾值
			{
				case 0: qs=0;  mw=5;  break;
				case 1: qs=5;  mw=13; break;
				case 2: qs=13; mw=15; break;
				default: qs=0; mw=5;  break;
			}			

			for(K=qs;K<mw;K++)			//显示一串字符
			{
			if(BR) break;				//如果按键切换了就跳出重取缓冲值
			for(i=0;i<32;i++)	Row_Data[i]=Word_Set1[K][i];				//装入一个字符的缓冲值
			while(!dz_start)			//启动定时器显示时检测start按键,无start一直在这;
			clear();							//点阵消隐,缓冲装空值
			TR0 = 1;						  //使能定时器中断
			switch_sz(300);					//按键一直在判断,大约耗时0.5s。此时定时器刷新一个字符
			TR0 = 0;
			P2=0xff;					    //点阵消隐
			}
		}
	}
}

注释写的很清楚了,只是代码是由原来一个8*8的静态输出的代码改的没花多少重新搞刷新算法(之前实验的动态刷新protues跑起来会卡)

下面是protues硬件图:

                                      

                                          

原文地址:https://www.cnblogs.com/jxlk233/p/10146190.html

时间: 2024-11-09 10:00:39

用51做的16*16点阵显示屏幕(ptotues仿真)的相关文章

[51单片机学习笔记FOUR]----16*16LED点阵

一.LED点阵发光原理 8*8单色单片机结构图如下: 从电路图中很简单的就可以看出来,想要点亮点阵中的某一个LED灯.只要使得那个灯所在的行输出高电平,所在列输出低电平就好. 二.点阵扫描实验 1 /*********************************************** 2 实验名称: 点阵扫描 3 实验说明: 扫描每个LED灯,检查点阵是否完好 4 实验时间: 2014/12/24 5 ******************************************

写出C语言的地址对齐宏ALIGN(p,alignbytes),其中p是要对齐的地址,alignbytes是要对齐的字节数(2的N次方),比如说:ALIGN(13,16)=16

写出C语言的地址对齐宏ALIGN(p,alignbytes),其中p是要对齐的地址,alignbytes是要对齐的字节数(2的N次方),比如说:ALIGN(13,16)=16. 答案:#define ALIGN(p,alignbytes) ((void*)(((unsigned long)p+alignbytes-1)&~(alignbytes-1)))

不使用局部变量和for循环或其它循环打印出如m=19,n=2結果为2 4 8 16 16 8 4 2形式的串

public static void Main(string[] args) { int m = 19; int n = 2; m = Recursionmult(m, n); RecursionDivision(m, n); //测试 m = 35; n = 4; Console.WriteLine("\nm=" + m + ",n=" + n); m = Recursionmult(m, n); RecursionDivision(m, n); m = 40;

高通小尺寸电子价签显示方案 — 支持12/16/24点阵字库

电子货架标签系统是高通智能科技在零售业的成功商业化应用产品之一.其主要功能是替代传统纸质价格标签的电子显示装置,通过有线或者无线网络与商场计算机数据库相连,并将商超等零售业的商品价格通过电子货架标签上的屏显示出来.电子货架标签系统成功地将货架纳入了计算机程序,摆脱了手动更换价格标签的状况,实现了收银台与货架之间的价格一致性. 目前,高通电子货架标签基于硬件与软件的开发已完全成熟,并自主研发了电子价签字库,使显示更加专业.规范且效果丰富多样化: 一.212x104分辨率:12.16.24点阵字库:

java 16 -16 键盘输入数据求最大值

需求: 键盘录入多个数据,输入0时得到结果,输出最大的一个 分析: A:创建键盘录入 B:由于数据个数不确定,用集合接收 C:把键盘录入的数据放进集合中 D:因为没学集合的排序,所以得先把集合转成数组 public Object[] toArray() 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组. public <T> T[] toArray(T[] a) 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组:返回数组的运行时类型是指定数组的运行时类型.

2018.4.16 16周4次课

十六周四次课(4月16日) 19.12 添加自定义监控项目 19.13/19.14 配置邮件告警 19.15 测试告警 19.16 不发邮件的问题处理 19.12 添加自定义监控项目 前面提到过zabbix的优势,其中之一就是很方便地添加自定义监控项目,它虽然提供了丰富的模板,但依然不能满足各种各样的特殊需求.比如,想要监控Nginx的访问日志条数,此类个性化需求在zabbix的模板中是没有的.下面举一个实际的例子来教你添加自定义的监控项目,这涉及编写shell脚本.需求是:监控某台web服务器

16.16

1 import java.awt.Graphics; 2 import java.awt.event.ActionEvent; 3 import java.awt.event.ActionListener; 4 5 import javax.swing.*; 6 7 8 9 public class Test_16_16 extends JFrame{ 10 11 public Test_16_16(){ 12 add(new JP()); 13 } 14 public static void

Sudoku(16*16)

Solution 一道神仙暴力剪枝题,思路是在9*9的数独之上,再多添加3个剪枝 1.判断每个空格中,如果一个字母都填不了就返回,如果只能填一个,就填上并继续搜索 2.对于每个字母,在每行\列\16宫格中判断能填的位置,如果没有就返回,如果只有一个就填上,并继续搜索 3.在上述剪枝完成后,再用位运算优化,取出最少的一个空格,并用lowbit运算取出能填的数 Attention!!! 1.宫格是真的恶心…… 2.注意填过了和不能填的区别 详细见代码 #include<bits/stdc++.h>

2016年8月15日 星期一 --出埃及记 Exodus 16:16

This is what the LORD has commanded: `Each one is to gather as much as he needs. Take an omer for each person you have in your tent.'" 耶和华所吩咐的是这样,你们要按着各人的饭量,为帐棚里的人,按着人数收起来,各拿一俄梅珥.