专栏首页机器人课程与技术stc89c52在Linux或MacOS下使用sdcc和stcgal中断与LCD测试代码

stc89c52在Linux或MacOS下使用sdcc和stcgal中断与LCD测试代码

使用说明参考:https://zhangrelay.blog.csdn.net/article/details/108449115

外部中断:

#include<8052.h>

#define LSA P1_5					
#define LSB P1_6
#define LSC P1_7

void EXint_Init(void);
void Delayms(unsigned int);
void Down2Up(int);		        
void Up2Down(int);				
void EXINT0() __interrupt 0;
void EXINT1() __interrupt 2;

void main()
{
	EXint_Init();	
	LSA=0;
	LSB=0;
	LSC=0;						
	while(1)					
	{
		P0 = 0xff;			
		Delayms(250);	         
		P0 = 0x00;				
		Delayms(250);
	}                         
}

void EXint_Init()              
{
	IT0=1;                     
	IT1=0;                     
//	IPH=0x40;                   
	PX1=1;                     
	EA=1;                       
	EX0=1;                      
	EX1=1;                      
}


void Delayms(unsigned int xms)
{
	unsigned int i,j;
	for(i = xms;i > 0;i--)
	{
		for (j = 110;j > 0;j--);
	}
}

void EXINT0() __interrupt 0     	
{
	Down2Up(3);					
}

void EXINT1() __interrupt 2       
{
	Up2Down(3);					
}

void Down2Up(int x) 				 
{	
	int i, j;
	unsigned char sel=0xfe;						
	for(i=0;i<x;i++)			
	{	
		for(j=0;j<8;j++)		
		{	
			P0 = sel;
			Delayms(250);		
			sel =sel<<1; 	
		}
		sel=0xfe;						
	}
}

void Up2Down(int x) 		
{	
	int i, j;
	unsigned char sel=0x7f;								
	for(i=0;i<x;i++)			
	{	
		for(j=0;j<8;j++)		
		{	
			P0 = sel;
			Delayms(250);	
			sel=sel>>1; 	
		}
		sel=0x7f;						
	}
}

定时器中断:

#include <8052.h>
#define  Wave   P0_1		        //位定义,定义完之后,以下 Wave 即代表P0.1
#define 	LSA    P1_5	   		// P0口所接的发光二极管由开发板上的WaveS0控制, 
#define 	LSB    P1_6	   		//且该位连接到74HC138三八译码器的输出端,
#define 	LSC    P1_7	   		//因此P1.5,P1.6,P1.7需赋值0以选中该位。
unsigned char cnt = 0;                  //定义一个计数变量,记录 T0 溢出次数
void Timer0() __interrupt 1;

/************************************************************/
void main ()					           //主函数
{
	LSA=0;						   //本开发板的P0发光二极管片选地址
	LSB=0;
	LSC=0;
	Wave = 0;					   //初始化P1.0=0
	TMOD = 0x01;				           //设置定时器T0工作方式1
	TL0  = 47104%256;			           //计数器初值
	TH0  = 47104/256;
	TR0  = 1;					   //启动定时器
	ET0  = 1;					   //开中断
	EA   = 1;
	while(1);                                          //模拟主程序其它工作
}
 /************************************************************/
void Timer0() __interrupt 1		        //定时器 T0 中断响应
{
 	TL0  = 47104%256;			//计数器初值
	TH0  = 47104/256;
	cnt++; //计数值自加 1
 	if (cnt > 49)                           //判断 T0 溢出是否达到 50 次,100次
 	{
	 Wave=1;
	 if (cnt > 99)
	 {
		 cnt=0;
		 Wave=0;
	 }
	 //cnt = 0; //达到 50 次后计数值清零
	 /*if( Wave = 0 )
	 {
		 Wave = 1;
	 }
	 else
	 {
		 Wave = 0;
	 }*/
	 
	 //Wave = ~Wave; //Wave 取反:0-->1、1-->0
 	}
}

helloworld:

#include<8052.h>
 
#define uchar unsigned char
#define uint unsigned int
 
#define lcden P1_2
#define lcdrs P1_0
#define rw P1_1
 
uchar table[] = "Hello World!";
uchar num;
 
void delay(uint z) {
    uint x, y;
    for(x = z; x > 0; x--)
        for(y = 110; y > 0; y--);
}
 
void write_com(uchar com) {
    lcdrs = 0;
    P0 = com;
    delay(5);
    lcden = 1;
    delay(5);
    lcden = 0;
}
 
void write_data(uchar date) {
    lcdrs = 1;
    P0 = date;
    delay(5);
    lcden = 1;
    delay(5);
    lcden = 0;
}
 
void init() {	
    rw = 0;
    lcden = 0;
    write_com(0x38);
    write_com(0x0e);
    write_com(0x06);
    write_com(0x01);
    write_com(0x80);
}
 
void main() {
    init();
    for(num = 0; num < 12; num++) {
        write_data(table[num]);
        delay(100);
    }
    while(1);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何快速学会单片机编程并应用?

    C51--(Arduino、MSP430)--(2812、28335)--(STM32、ARM9)--(TK1、BeagleBone、Raspberry Pi)

    zhangrelay
  • 使用机器人操作系统ROS 2和仿真软件Gazebo 9目标跟踪实践(四)

    目标跟踪可以使用激光或视觉传感器,本节开始只提供思路,无教程,供有兴趣的朋友自主实践。

    zhangrelay
  • ROS2GO之TurtleBot学习与使用资料

    TurtleBot2最佳环境为indigo或kinetic,TurtleBot3最佳环境为kinetic或melodic。

    zhangrelay
  • 实验7 3D机器人

    (1) 熟悉视点观察函数的设置和使用。 (2) 熟悉3D图形变换的设置和使用。 (3) 进一步熟悉基本3D图元的绘制。 (4) 体验透视投影和正交投影的不...

    步行者08
  • 创建Python数据分析的Docker镜像+Docker自定义镜像commit,Dockerfile方式解析+pull,push,rmi操作

    实例解析Docker如何通过commit,Dockerfile两种方式自定义Dcoker镜像,对自定义镜像的pull,push,rmi等常用操作,通过实例创建一...

    王小雷
  • 【Linux笔记】LED驱动

    上一篇我们分享了字符设备驱动框架:嵌入式Linux驱动基础,当时分享的是hello驱动程序。学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩...

    正念君
  • 一个优秀的镜像仓库是什么样的?

    魏新宇
  • 常见sql注入原理详解!

    $config = ['hostname'=>"localhost", 'port'=>"3306", 'username'=>"root",'password...

    思梦php
  • 谁说苹果不玩儿AI的:AI与AR造WWDC17大会两大亮点(全程回顾+视频)

    大数据文摘
  • 零基础入门 31:游戏中的变速效果

    今天给大家带来一篇短小精悍的内容,那就是游戏中的变速效果,变速包括了快速和慢速,有的时候在游戏关卡结尾的时候通过慢速慢镜头来展示结束动作特效等,有不错的表现效果...

    韩东吉

扫码关注云+社区

领取腾讯云代金券