⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 37.c

📁 一些单片机的经典例程
💻 C
字号:
#include <reg51.h>

sbit p_a0=P3^0;
sbit p_rw=P3^1;
sbit p_e=P3^2;

//指令写入函数
void ctrl(unsigned char c) 
{
	p_a0=1;			                    //a0为1代表写入指令
	p_rw=0;
	p_e=1;P1=c;p_e=0;
}
//数据和指令参数写入函数
void write(unsigned char d) 
{
	p_a0=0;			                   //a0为0代表写入数据或指令参数
	p_rw=0;
	p_e=1;P1=d;p_e=0;
}
//数据和光标地址读出函数
unsigned char read(void) 
{
	unsigned char rd;
	p_a0=1;			                   //a0为1代表读数据和光标地址,a0为0代表
//读状态标志,由于E-1330功能很强,一般//不用读状态标志
	p_rw=1;
	P=0xff;			                    //把P1置为高电平,只有置为高电平才能正
//确读入数据
	p_e=1;rd=P1;p_e=0;
	return(rd);
}

//其他函数可以根据资料自行组合,如设置
//CGROM相对地址为0000H,用以下语句即可:	
	ctrl(0x5c);		                    //写入5C指令
	write(0);
	write(0);		                    //写入5C指令的参数0000


//5单个汉字库字摸提取程序
#include "stdio.h"
#include "dos.h"
#include "process.h"
#include "string.h"

void main(void) 
{
	long int num_bytes,qm,wm;
	unsigned char d,i,j,k,a[132],b[132];
	unsigned char * data;
	unsigned char * hz;
	static unsigned  char dd[103];
	FILE *fp;

	if ((fp=fopen("hzk16f","rb"))==NULL) 
{
		printf("can't open hzk16\n");
		exit(1);
	}
	clrscr();
	while (1) 
{

		data=(unsigned char *) malloc(33);
		printf("please input:\n");
		scanf("%s",dd);                      	//输入一个汉字

		qm=* dd;		                        //通过区位码计算其在hzk16f文件
//中的偏移地址
		qm=qm-161;
		if (qm>87) exit(0);
		wm=* (dd+1);
		wm=wm-161;
		if (wm>94) exit(0);
		num_bytes=((long)qm*94+wm)*32;
		fseek(fp,num_bytes,SEEK_SET);
		fgets(data,33,fp);
		for (i=0;i<32;i++) b[i]=* data++;
		for (i=0;i<32;i+=2) a[i/2]=b[i];
		for (i=0;i<32;i+=2) a[i/2+16]=b[i+1];
		for (i=8;i<16;i++) b[i]=a[i];
		for (i=8;i<16;i++) a[i]=a[i+8];
		for (i=8;i<16;i++) a[i+8]=b[i];

		                              //转换,hzf16f在电脑的储存格式是以行为字
//节计算的,一般的lcd都采用以列为字节计算
		for (k=0;k<32;k+=8) 
{
			for (j=0;j<8;j++) 
{
				d=0;
				for (i=0;i<8;i++) 
{
					if (a[i+k]>=0x80) 
{
						switch (i) 
{
						case 0:d+=1;break;
						case 1:d+=2;break;
						case 2:d+=4;break;
						case 3:d+=8;break;
						case 4:d+=0x10;break;
						case 5:d+=0x20;break;
						case 6:d+=0x40;break;
						case 7:d+=0x80;break;
						}
					}
				}
				for (i=0;i<8;i++) a[i+k]<<=1;
				b[j+k]=d;
			}
		}
		clrscr();
		printf("/*%s:*/\n",dd);		              //输出0x00格式的16进制数
		for (k=0;k<32;k+=8) 
{
			for (j=0;j<8;j++) printf("0x%x,",b[j+k]);
			printf("\n");
		}
		getch();
	}
}

//按键扫描驱动程序

unsigned char key,key_h,kpush;
unsigned int key_l;

//按键连接到p1.0、p1.1、p1.2

void int_t0(void) interrupt 1 
{
	unsigned char dd,i;
	TL0=TL0+30;TH0=0xfb;	                     //800
	                                             //按键判别	
	if ((P1&0x7)==0x7) 
{
		if ((key_l>30)&&(key_l<800)&&(key_h>30)) 
{		                                            //释放按键,如果之前按键时
//间少于1秒,读入键值
			key=kpush;
		}
		if ((++key_h)>200) key_h=200;
		key_l=0;
		if (key>=0x80) key=0;						//如果之前的按键为长按1秒,
//清除键值
	} else {
		kpush=P1&0x7;
		key_l++;
		if ((key_l>800)&&(key_h>30)) 
{					                                //如果按键超过1秒,键值加
//0x80标志长按键
			key=kpush|0x80;
			key_h=0;
			key_l=0;
		}
	}
}
void main(void) 
{
	TMOD=0x1;TR0=1;ET0=1;EA=1;
	while (1) 
{
		while (!key) {}
		switch (key) {
		case 1:break;
		case 2:break;
		}
	}
}

//串行驱动led显示
//一个74hc595位移寄存器驱动三极管驱动led位,
//两个74hc595驱动led段,方式位5位x8段x2=10个数码管
//5分频,每次扫描时间位1.25ms
//定义特殊符号

#define nul 0xf
#define qc 0xc
#define qb 0xb
#define q_ 0xa
#define q__ 0xd
#define q___ 0xe
#define qp 0x10
#define qe 0x11
#define qj 0x12
#define qn 0x13
#define qf 0x14
#define qa 0x15
#define qr 0x16
#define qd 0x17
#define qu 0x18
#define ql 0x19
#define qh 0x1a
#define qwen 0x1b
#define qt 0x1c
#define qla 0x1d
#define qlb 0x1e
#define qlc 0x1f
#define qld 0x20
#define qle 0x21
#define qlf 0x22
#define qlg 0x23
#define qldp 0x24

//显示段信息,不同led排列组合的段信息只需更改8个数值即可。
//因此,该定义具有通用性。

//显示	
//-d 20
//|c 40|e 10
//- g	80		
//|b 2|f 4
//_a1.dp 8
#define pa 1
#define pb 2
#define pc 0x40
#define pd 0x20
#define pe 0x10
#define pf 4 
#define pg 0x80
#define pdp 8
#define l0 pdp+pg
#define l1 255-pf-pe
#define l2 pdp+pc+pf
#define l3 pdp+pc+pb
#define l4 pdp+pa+pb+pd
#define l5 pdp+pb+pe
#define l6 pdp+pe
#define l7 pdp+pc+pg+pb+pa
#define l8 pdp
#define l9 pdp+pb
#define la pdp+pa
#define lb pdp+pd+pe
#define lc pdp+pg+pe+pf
#define ld pdp+pc+pd
#define le pdp+pe+pf
#define lf pdp+pe+pf+pa
#define l_ 255-pg
#define lnul 255
#define ll pdp+pg+pd+pf+pe
#define lp pdp+pa+pf
#define lt pdp+pd+pe+pf
#define lr pdp+pe+pf+pg+pa
#define ln pdp+pg+pa
#define lh pdp+pd+pe+pa
#define ly pdp+pb+pd
#define lu pdp+pg+pd
#define l__ pdp+pg+pb+pc+pe+pf
#define l___ l__-pg
#define l_1 255-pa
#define l_2 255-pa-pg
#define lj 255-(pe+pf+pa)
#define lwen 255-(pd+pe+pg+pb)
#define lall 0

#define lla 255-pa
#define llb 255-pb
#define llc 255-pc
#define lld 255-pd
#define lle 255-pe
#define llf 255-pf
#define llg 255-pg
#define lldp 255-pdp

//串行送出的位信息,目前是10位led显示。
unsigned char code un_dig[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};
//串行送出的短信息。
Unsigned Char code 
un_disp[]={l0,l1,l2,l3,l4,l5,l6,l7,l8,l9,l_,lb,lc,l__,l___,lnul,lp,le,lj,ln,lf,la,lr,ld,lu,ll,lh,lwen,lt,lla,llb,llc,lld,lle,llf,llg,lldp,lnul};

sbit d_clk=P0^0;		                       //移位时钟
sbit d_dat=P0^1;		                       //移位数据
sbit d_st=P0^2;			                       //移位锁定
unsigned char dig;			                   //位扫描计数器
unsigned char d[10];						   //显示缓冲

//送出8位串行数据
void out_disp(unsigned char dd) 
{
	unsigned char i;
	for (i=0;i<8;i++) 
{
		if (dd&1) d_dat=1; else d_dat=0;
		d_clk=0;
		dd>>=1;
		d_clk=1;
	}
}
//控制小数点和闪烁,显示数据|0x040
//表示有小数点;显示数据|0x80表示闪烁。
void out_displ(unsigned char dd) 
{
	if (dd>=0x80) 
{
		if (s001>flash_time) {out_disp(0xff);return;}
	}
	dd&=0x7f;
	if (dd>=0x40) 
{
		dd=un_disp[dd&0x3f]^pdp;
	} else dd=un_disp[dd];
	out_disp(dd);
}

unsigned int s001;	                   //闪烁时间参考
void int_t0(void) interrupt 1
{
	unsigned char dd;
	TL0=TL0+30;TH0=0xfb;	           //800
	time++;
	if ((++s001)>=800) s001=0;
	                                    //显示	
	if ((++dig)>4) dig=0;
	d_st=0;
	dd=d[dig+5];
	out_displ(dd);
	dd=d[dig];
	out_displ(dd);
	out_disp(un_dig[dig]);
	d_st=1;
}
void main(void)
 {
	unsigned char i;
	TMOD=0x1;
	TR0=ET0=1;
	EA=1;
	for (i=0;i<10;i++) d[i]=i;	        //display test
	while (1) {}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -